#include <sys_head.h>


int my_file_stat(const char * file_name);

int main(int argc, char const *argv[])
{
    if (2 != argc)
    {
        printf("参数错误:%s dirname\n" , argv[0]);
        return 0;
    }
    
    char file_name[1024];

    // 打开目录
    DIR * dir = opendir(argv[1]);
    if (NULL == dir)
    {
        ERRLOG("opendir erron");
    }
    struct dirent * read_dir;
    while ( (read_dir = readdir(dir)) != NULL )
    {
        memset(file_name , 0 , sizeof(file_name));

        if (strncmp(read_dir->d_name , "." , 1))
        {
            // 在文件名前面增加上目录
            sprintf(file_name , "./%s/%s" , argv[1] , read_dir->d_name);
            // printf("%s\n" , file_name);
            printf("=========================================\n");
            my_file_stat(file_name);
            printf("=========================================\n");
        }
    }
    

    closedir(dir);
    
    return 0;
}



int my_file_stat(const char * file_name)
{
// ./复习/03_file_r_w.c
// 
    
    struct stat statbuf;

    stat(file_name , &statbuf);
    // 获取文件名
    

    int byt_n;

    for (size_t i = 0; file_name[i] != '\0'; i++)
    {
        if ('/' == file_name[i])
        {
            byt_n = i;
        }
    }
    
   printf("file name: %s \n" , &file_name[byt_n + 1] );


    // 获取 inode 编号
    printf("inode:%ld\n" , statbuf.st_ino);

    // 获取硬链接的数量
    printf("硬链接:%ld\n" , statbuf.st_nlink);

    // 文件所有者的用户 ID
    printf("user id:%d\n" , statbuf.st_uid);

    // 获取 用户 所属者姓名
    struct passwd * user;
    user = getpwuid(statbuf.st_uid);
    printf("user name: %s\n" , user->pw_name);

    // 文件所有者的组 GID
    printf("user gid:%d\n" , statbuf.st_gid);

    // 获取 用户组 名称
    struct group * Group;
    Group = getgrgid(statbuf.st_gid);
    printf("group name: %s\n" , Group->gr_name);

    // 获取文件大小
    printf("file zise:%ld\n" , statbuf.st_size);

    // 获取文件时间
    printf("time : %ld\n" , statbuf.st_mtime);

    // 打印时间 1970 开始计时的 秒数
    struct tm * time_stu = localtime(&statbuf.st_mtime);
    printf("时间 : %d : %d : %d\n", time_stu->tm_hour , time_stu->tm_min , time_stu->tm_sec);
    printf("日期 : %d : %d : %d\n", time_stu->tm_year + 1900, time_stu->tm_mon + 1 , time_stu->tm_mday );



    printf("文件类型: ");
    switch (statbuf.st_mode & S_IFMT) {  // 使用 S_IFMT 掩码获取文件类型
        case S_IFREG:
            printf("常规文件\n");
            break;
        case S_IFDIR:
            printf("目录\n");
            break;
        case S_IFCHR:
            printf("字符设备\n");
            break;
        case S_IFBLK:
            printf("块设备\n");
            break;
        case S_IFIFO:
            printf("管道或 FIFO\n");
            break;
        case S_IFLNK:
            printf("符号链接\n");
            break;
        case S_IFSOCK:
            printf("套接字\n");
            break;
        default:
            printf("未知类型\n");
            break;
    }


    printf("文件权限: ");
    printf((statbuf.st_mode & S_IRUSR) ? "r" : "-");
    printf((statbuf.st_mode & S_IWUSR) ? "w" : "-");
    printf((statbuf.st_mode & S_IXUSR) ? "x" : "-");
    printf((statbuf.st_mode & S_IRGRP) ? "r" : "-");
    printf((statbuf.st_mode & S_IWGRP) ? "w" : "-");
    printf((statbuf.st_mode & S_IXGRP) ? "x" : "-");
    printf((statbuf.st_mode & S_IROTH) ? "r" : "-");
    printf((statbuf.st_mode & S_IWOTH) ? "w" : "-");
    printf((statbuf.st_mode & S_IXOTH) ? "x" : "-");
    printf("\n");


    return 0;
}

